#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

sem_t sem_r;
sem_t sem_w;
char buf[1024];
int stop = 0;

void * thread_func(void *){
    while(!stop){
        sem_wait(&sem_r);
        printf("Data read: %s, %ld,\n", buf, strlen(buf));
        memset(buf, 0, sizeof(buf));
        sem_post(&sem_w);
    }
    printf("child thread exit\n");
    return NULL;
}

int main(){
    // 初始化信号量sem_r，初始值为0
    int res = sem_init(&sem_r,0, 0);
    if(res < 0){
        perror("sem_init");
        exit(1);
    }

    // 初始化信号量sem_w，初始值为1
    res = sem_init(&sem_w, 0, 1);
    if(res < 0){
        perror("sem_init");
        exit(1);
    }

    // 创建线程
    pthread_t tid;
    res = pthread_create(&tid, NULL, thread_func, buf);
    if(res){
        perror("pthread_create");
        exit(1);
    }

    // 循环等待用户输入
    do{
        // 等待sem_w信号量，若sem_w的值大于0，则sem_w的值减1，线程继续执行；否则线程阻塞，直到sem_w的值大于0
        sem_wait(&sem_w);
        // 从标准输入读取一行数据到buf中
        fgets(buf, sizeof(buf), stdin);
        // 释放sem_r信号量，使sem_r的值加1
        sem_post(&sem_r);
    }while(strcmp(buf, "quit\n") != 0); // 若输入不为"quit\n"，则继续循环

    // 设置停止标志位stop为1
    stop = 1;
    // 释放sem_r信号量，使sem_r的值加1
    sem_post(&sem_r);
    // 等待线程tid结束
    pthread_join(tid, NULL);
    // 打印主线程退出信息
    printf("main thread exit\n");
    return 0;
}